picture: Avoid some unnecessary signal connections
authorTimm Bäder <mail@baedert.org>
Fri, 21 Dec 2018 08:26:38 +0000 (09:26 +0100)
committerTimm Bäder <mail@baedert.org>
Mon, 31 Dec 2018 11:44:02 +0000 (12:44 +0100)
We don't need to ever invalidate the picture size if the paintable tells
us its size is static. Same for the contents.

gtk/gtkpicture.c

index ba81e517ab24e5c2e06fcfa79f4e1b2778f38f3f..1ae495c35d752d70dc4bdd3d042c61a65cd16168 100644 (file)
@@ -798,26 +798,36 @@ gtk_picture_set_paintable (GtkPicture   *self,
 
   if (self->paintable)
     {
-      g_signal_handlers_disconnect_by_func (self->paintable,
-                                            gtk_picture_paintable_invalidate_contents,
-                                            self);
-      g_signal_handlers_disconnect_by_func (self->paintable,
-                                            gtk_picture_paintable_invalidate_size,
-                                            self);
+      const guint flags = gdk_paintable_get_flags (self->paintable);
+
+      if ((flags & GDK_PAINTABLE_STATIC_CONTENTS) == 0)
+        g_signal_handlers_disconnect_by_func (self->paintable,
+                                              gtk_picture_paintable_invalidate_contents,
+                                              self);
+
+      if ((flags & GDK_PAINTABLE_STATIC_SIZE) == 0)
+        g_signal_handlers_disconnect_by_func (self->paintable,
+                                              gtk_picture_paintable_invalidate_size,
+                                              self);
     }
 
   self->paintable = paintable;
 
   if (paintable)
     {
-      g_signal_connect (paintable,
-                        "invalidate-contents",
-                        G_CALLBACK (gtk_picture_paintable_invalidate_contents),
-                        self);
-      g_signal_connect (paintable,
-                        "invalidate-size",
-                        G_CALLBACK (gtk_picture_paintable_invalidate_size),
-                        self);
+      const guint flags = gdk_paintable_get_flags (paintable);
+
+      if ((flags & GDK_PAINTABLE_STATIC_CONTENTS) == 0)
+        g_signal_connect (paintable,
+                          "invalidate-contents",
+                          G_CALLBACK (gtk_picture_paintable_invalidate_contents),
+                          self);
+
+      if ((flags & GDK_PAINTABLE_STATIC_SIZE) == 0)
+        g_signal_connect (paintable,
+                          "invalidate-size",
+                          G_CALLBACK (gtk_picture_paintable_invalidate_size),
+                          self);
     }
 
   gtk_widget_queue_resize (GTK_WIDGET (self));